跳到主要内容

项代理(ItemDelegate)

ItemDelegate类用于编辑 ListWidgetTableWidgetTreeWidget等控件的项Item的文本内容。 您可以通过调用 edit() 来编辑某一个项的内容。该类允许基于 validator 属性定义的规则约束文本输入。

事件

当编辑器控件完成数据编辑时,会触发数据更改事件 itemDataChanged

// 监听数据更改事件
itemDelegate.bind('itemDataChanged', (event: ItemDataChangeEvent): void => {
event.item as ViewItem; // 被编辑的项目。
event.data; // 编辑后的数据。
});

示例代码

以下代码展示了如何创建一个 ItemDelegate

const desktop = Desktop.instance();
const listWidget = new ListWidget(desktop);
const osNames = ['Windows 10', 'Windows Server 2016', 'Mac OS', 'IOS', 'Ubuntu', 'Debian', 'Android', 'RedHat'];
osNames.forEach((name: string): void => {
listWidget.addItem(name);
});

const itemDelegate = new ItemDelegate;
listWidget.bind('itemClicked', (event: ItemClickEvent): void => {
itemDelegate.edit(event.item as ViewItem);
});

自定义代理

如果需要编辑某一项时弹出一个下拉框(如 ComboBox),可以通过继承 AbstractItemDelegate 并重写受保护函数 createEditor()setItemData() 来实现。

const osNames = ['Windows 10', 'Windows Server 2016', 'Mac OS', 'IOS', 'Ubuntu', 'Debian', 'Android', 'RedHat'];

class ComboItemDelegate extends AbstractItemDelegate {

constructor() {
super();
this.m_editOnClose = false;
}

protected createEditor(item: ViewItem): Widget {
const editor = new ComboBox(item);
osNames.forEach((name: string) => {
editor.add(name);
});

editor.text = item.text;
editor.bind('indexChanged', (event: IndexChangeEvent) => {
this.setItemData(editor, item);
});
return editor;
}

protected setItemData(editor: Widget, item: ViewItem): void {
const comboBox = editor as ComboBox;
if (item.text !== comboBox.text) {
item.text = comboBox.text;
this.emit('itemDataChanged', { item, data: comboBox.text });
}
}
}

...
const itemDelegate = new ComboItemDelegate;
...